package quantifiedAndroid.classes;

import java.io.File;
import java.io.IOException;

import android.media.MediaRecorder;
import android.os.Environment;

/**
* @author Ben McCann
*/
public class AudioRecorder {

	final MediaRecorder recorder = new MediaRecorder();
	final String path;

	/**
	* Creates a new audio recording at the given path (relative to root of SD card).
	*/
	public AudioRecorder(String path, String fileName) {
		this.path = sanitizePath(path + fileName);		
	}

	private String sanitizePath(String path) {
		if (!path.startsWith("/")) {
			path = "/" + path;
		}
		if (!path.contains(".")) {
			path += ".3gp";
		}
		return Environment.getExternalStorageDirectory().getAbsolutePath() + path;
	}

	/**
	* Starts a new recording.
	*/
	public void start() throws IOException {
		String state = android.os.Environment.getExternalStorageState();
		if(!state.equals(android.os.Environment.MEDIA_MOUNTED)) {
			throw new IOException("SD Card is not mounted. It is " + state + ".");
		}

		// make sure the directory we plan to store the recording in exists
		File directory = new File(path).getParentFile();
		if (!directory.exists() && !directory.mkdirs()) {
			throw new IOException("Path to file could not be created.");
		}

		recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_UPLINK);
		recorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR);
		recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
		recorder.setOutputFile(path);
		recorder.prepare();
		recorder.start();
	}

	/**
	* Stops a recording that has been previously started.
	*/
	public void stop() throws IOException {
		recorder.stop();
		recorder.release();
	}

}